package persistentie;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import util.Datum;
import domein.Auto;

public class AutoMapper extends Mapper
{
/*Attributen*/
	private final static String SELECTEER_AUTOS = "SELECT * FROM autos";
	private final static String SELECTEER_AUTOS_MET_PERIODE = "SELECT autos.* FROM autos LEFT OUTER JOIN huurovereenkomsten ON autos.autoId = huurovereenkomsten.auto AND (( huurovereenkomsten.beginDatum > ? AND huurovereenkomsten.beginDatum < ? ) OR ( huurovereenkomsten.beginDatum < ? AND huurovereenkomsten.eindDatum > ? )) GROUP BY autos.autoId HAVING COUNT(huurovereenkomsten.huurovereenkomstId) = 0";
	private final static String TOEVOEGEN_AUTO = "INSERT INTO autos (autoCategorie,autoMerk,autoType,bestelplaats,bouwjaar,kmstand,kenteken,chassisnummer,transmissie,brandstof,aantalDeuren,airco,aantalZitplaatsen,aantalStuksBagage,dagprijs,waarborgcode,verbruik) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
	private final static String UPDATE_AUTO = "UPDATE autos SET autoCategorie = ?,autoMerk = ?,autoType = ?,bestelplaats = ?,bouwjaar = ?,kmstand = ?,kenteken = ?,chassisnummer = ?,transmissie = ?,brandstof = ?,aantalDeuren = ?,airco = ?,aantalZitplaatsen = ?,aantalStuksBagage = ?,dagprijs = ?,waarborgcode = ?,verbruik = ? WHERE autoId = ?";
	private final static String VERWIJDER_AUTO = "DELETE FROM autos WHERE autoId = ?";
	private final static String LAATST_INVOERDE_AUTO = "SELECT autoId FROM autos ORDER BY autoId DESC";

/*Methodes*/
	public List<Auto> geefAutos(Datum beginDatum,Datum eindDatum)
	{		
		List<Auto> autoLijst = new ArrayList<Auto>();
		verbinding = PersistentieController.getInstance().getVerbinding();

		try
		{
			statement = verbinding.createStatement();
			if(beginDatum==null || eindDatum==null)
				resultaat = statement.executeQuery(SELECTEER_AUTOS);
			else
			{
				initQuery(SELECTEER_AUTOS_MET_PERIODE);
				pStatement.setDate(1, beginDatum.converteerNaarSql());
				pStatement.setDate(2, eindDatum.converteerNaarSql());
				pStatement.setDate(3, beginDatum.converteerNaarSql());
				pStatement.setDate(4, beginDatum.converteerNaarSql());
				resultaat = pStatement.executeQuery();
			}
			
			while (resultaat.next())
			{
				int autoId = resultaat.getInt("autoId");
				String autoCategorie = resultaat.getString("autoCategorie");
				String autoMerk = resultaat.getString("autoMerk");
				String autoType = resultaat.getString("autoType");
				String bestelplaats = resultaat.getString("bestelplaats");
				int bouwjaar = resultaat.getInt("bouwjaar");
				double kmstand = resultaat.getDouble("kmstand");
				String kenteken = resultaat.getString("kenteken");
				String chassisnummer = resultaat.getString("chassisnummer"); //17 digits
				boolean transmissie = resultaat.getBoolean("transmissie");
				String brandstof = resultaat.getString("brandstof");
				int aantalDeuren = resultaat.getInt("aantalDeuren");
				int airco = resultaat.getInt("airco");
				int aantalZitplaatsen = resultaat.getInt("aantalZitplaatsen");
				int aantalStuksBagage = resultaat.getInt("aantalStuksBagage");
				double dagprijs = resultaat.getDouble("dagprijs");
				String waarborgcodetemp = resultaat.getString("waarborgcode");
				char waarborgcode = waarborgcodetemp.charAt(0);
				double verbruik = resultaat.getDouble("verbruik");

				Auto auto = new Auto(autoId,autoCategorie, autoMerk, autoType,
						bestelplaats, bouwjaar, kmstand, kenteken,
						chassisnummer, transmissie, brandstof, aantalDeuren,
						airco, aantalZitplaatsen, aantalStuksBagage, dagprijs,
						waarborgcode, verbruik);

				autoLijst.add(auto);
			}
			return autoLijst;
		} 
		catch (SQLException e)
		{
			e.printStackTrace();
		}
		finally
		{
			try
			{
				this.closeStatement();
				this.closeConnection();
			}
			catch(Exception e)
			{
				e.printStackTrace();
			}
		}
		return null;
	}
	public void voegAutoToe(Auto auto)
	{
		verbinding = PersistentieController.getInstance().getVerbinding();
		initQuery(TOEVOEGEN_AUTO);
		
		try {
			pStatement.setInt(1, Integer.parseInt(auto.getAutoCategorie()));//voorlopig
			pStatement.setString(2, auto.getAutoMerk());
			pStatement.setString(3,auto.getAutoType());
			pStatement.setInt(4, Integer.parseInt(auto.getBestelplaats()));//voorlopig
			pStatement.setInt(5,auto.getBouwjaar());
			pStatement.setDouble(6,auto.getKmstand());
			pStatement.setString(7,auto.getKenteken());
			pStatement.setString(8,auto.getChassisnummer());
			pStatement.setBoolean(9,auto.isTransmissie());
			pStatement.setInt(10,Integer.parseInt(auto.getBrandstof()));//voorlopig
			pStatement.setInt(11,auto.getAantalDeuren());
			pStatement.setInt(12,auto.getAirco());
			pStatement.setInt(13,auto.getAantalZitplaatsen());
			pStatement.setInt(14,auto.getAantalStuksBagage());
			pStatement.setDouble(15,auto.getDagprijs());
			pStatement.setString(16,""+auto.getWaarborgcode());
			pStatement.setDouble(17,auto.getVerbruik());
			pStatement.executeUpdate();
			
		/*Ophalen laatste id >> nog niet optimaal*/			
			auto.setAutoId(this.haalLaatstIngevoegdId(LAATST_INVOERDE_AUTO));
		}
		catch (SQLException e)
		{
			e.printStackTrace();
		}
		finally
		{
			try
			{
				this.closePreparedStatement();
				this.closeConnection();
			}
			catch(Exception e)
			{
				e.printStackTrace();
			}
		}
	}
	public void wijzigAuto(Auto auto)
	{
		verbinding = PersistentieController.getInstance().getVerbinding();
		initQuery(UPDATE_AUTO);
		
		try {
			pStatement.setInt(1, Integer.parseInt(auto.getAutoCategorie()));//voorlopig
			pStatement.setString(2, auto.getAutoMerk());
			pStatement.setString(3,auto.getAutoType());
			pStatement.setInt(4, Integer.parseInt(auto.getBestelplaats()));//voorlopig
			pStatement.setInt(5,auto.getBouwjaar());
			pStatement.setDouble(6,auto.getKmstand());
			pStatement.setString(7,auto.getKenteken());
			pStatement.setString(8,auto.getChassisnummer());
			pStatement.setBoolean(9,auto.isTransmissie());
			pStatement.setInt(10,Integer.parseInt(auto.getBrandstof()));//voorlopig
			pStatement.setInt(11,auto.getAantalDeuren());
			pStatement.setInt(12,auto.getAirco());
			pStatement.setInt(13,auto.getAantalZitplaatsen());
			pStatement.setInt(14,auto.getAantalStuksBagage());
			pStatement.setDouble(15,auto.getDagprijs());
			pStatement.setString(16,""+auto.getWaarborgcode());
			pStatement.setDouble(17,auto.getVerbruik());
			pStatement.setInt(18, auto.getAutoId());
			pStatement.executeUpdate();
		}
		catch (SQLException e)
		{
			e.printStackTrace();
		}
		finally
		{
			try
			{
				this.closePreparedStatement();
				this.closeConnection();
			}
			catch(Exception e)
			{
				e.printStackTrace();
			}
		}
	}
	public void verwijderAuto(Auto auto)
	{
		verbinding = PersistentieController.getInstance().getVerbinding();
		initQuery(VERWIJDER_AUTO);
		
		try {
			pStatement.setInt(1, auto.getAutoId());
			pStatement.executeUpdate();
		}
		catch (SQLException e)
		{
			e.printStackTrace();
		}
		finally
		{
			try
			{
				this.closePreparedStatement();
				this.closeConnection();
			}
			catch(Exception e)
			{
				e.printStackTrace();
			}
		}
	}
}
